/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Reportes.DAO;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Continente;
import pe.edu.pucp.Modelo.Pais;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.HibernateUtil;

/**
 *
 * @author oscar
 */
public class ReporteAlmacenDAO {
    
    
    public ArrayList<Continente> listarContinente(){
        ArrayList<Continente> listaContinente = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        String q = "select ct from Continente ct order by ct.idcontinente";
        Query query = session.createQuery(q);
        List lista = query.list();
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Continente a = (Continente) iter.next();
            listaContinente.add(a);
        }
        
        tx.commit();
        session.close();

        return listaContinente;
    } 
    
    public ArrayList<Ciudad> listarCiudad(int idpa){
        ArrayList<Ciudad> listaCiudad = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        Query query = session.createQuery("select c from Ciudad c where c.pais.idpais = :id order by c.idciudad");        
        query.setInteger("id", idpa);
        List lista = query.list();        
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Ciudad a = (Ciudad) iter.next();
            Hibernate.initialize(a.getPais());
            listaCiudad.add(a);
        }
        
        tx.commit();
        session.close();

        return listaCiudad;
    } 
    
    public ArrayList<Pais> listarPais(int idcont){
        ArrayList<Pais> listaPais = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        Query query = session.createQuery("select p from Pais p where p.continente.idcontinente = :id order by p.idpais");
        query.setInteger("id", idcont);
        List lista = query.list();
        Iterator iter = lista.iterator();        
        while (iter.hasNext()) {    
            Pais a = (Pais) iter.next();
            Hibernate.initialize(a.getContinente());
            listaPais.add(a);
        }
        
        tx.commit();
        session.close();

        return listaPais;
    } 
    
    
    public ArrayList<Aeropuerto> listarAeropuertos2(Pais pais)
    {   
        ArrayList<Aeropuerto> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        
        try {
            tx = session.beginTransaction();

            // Prepara cadena query
            String q = "select aeropuerto from Aeropuerto aeropuerto where aeropuerto.estadoAeropuerto.descripcion != 'INACTIVO' ";
            if(pais != null)
                q+= " AND aeropuerto.ciudad.pais.idpais = :idPaisParam ";
            q+= " order by aeropuerto.ciudad.pais.descripcion asc ";

            // Crear query
            Query query = session.createQuery(q);
            if(pais != null) 
                query.setParameter("idPaisParam", pais.getIdpais());

            // Ejecutar query
            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
                Hibernate.initialize(a.getCiudad().getPais());
//                Hibernate.initialize(a.getEstadoAeropuerto());
                Hibernate.initialize(a.getCiudad().getPais().getContinente());
                listaResultados.add(a);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
                throw e;
           }
        } finally {
            session.close();

            return listaResultados;
        }
    }
    
    
    public ArrayList<Aeropuerto> listaAeropuertoByPais(int pais) {
        ArrayList<Aeropuerto> lstAeropuertos = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try {
            tx = session.beginTransaction();
            
            Query query = session.createQuery("select aeropuerto from Aeropuerto aeropuerto,"
                     + " Ciudad ciudad, Pais pais where "
                     + " pais.idpais=ciudad.pais.idpais"
                     + " and aeropuerto.ciudad.idciudad = ciudad.idciudad"
                     + " and pais.idpais = :idPais");
            query.setParameter("idPais", pais);

            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
                lstAeropuertos.add(a);
            } 
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }    
        } finally {
            session.close();
        }
        return lstAeropuertos;
    }
    
    public ArrayList<Aeropuerto> listaAeropuertoByContinente(int continente) {
        ArrayList<Aeropuerto> lstAeropuertos = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try {
            tx = session.beginTransaction();

            Query query = session.createQuery("select aeropuerto from Aeropuerto aeropuerto,"
                     + " Ciudad ciudad, Continente continente, Pais pais where "
                     + " continente.idcontinente = pais.continente.idcontinente"
                     + " and pais.idpais=ciudad.pais.idpais"
                     + " and aeropuerto.ciudad.idciudad = ciudad.idciudad"
                     + " and continente.idcontinente = :idContinente");
            query.setParameter("idContinente", continente);

            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
//                Hibernate.initialize(a.getEstadoAeropuerto());
//                Hibernate.initialize(a.getCiudad());
//                Hibernate.initialize(a.getCiudad().getCordx());
//                Hibernate.initialize(a.getCiudad().getCordy());
//                a.setEstadoAeropuerto(a.getEstadoAeropuerto());
                lstAeropuertos.add(a);
            } 
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }    
        } finally {
            session.close();
        }
        return lstAeropuertos;
    }
    
    public ArrayList<Aeropuerto> listarAeropuertos(int continente, int pais, int ciudad) {
        ArrayList<Aeropuerto> result = new ArrayList<>();
         
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try {
            tx = session.beginTransaction();

            String q = " select aeropuerto from Aeropuerto aeropuerto where aeropuerto.estadoAeropuerto.descripcion ='ACTIVO' ";
            if (ciudad > 0) 
                q += " AND aeropuerto.ciudad.idciudad = :ciudadParam ";
            else 
                if (pais > 0)
                   q += " AND aeropuerto.ciudad.pais.idpais = :paisParam";
                else 
                    if (continente > 0) 
                        q+= "  AND aeropuerto.ciudad.pais.continente.idcontinente = :continenteParam ";
//            if( fechaRegistro != null) 
//                q+= " AND aeropuerto.fechareg >= :fechaParam ";
            
            System.out.println("query:" + q);
            
            Query query = session.createQuery(q);
            if(ciudad>0) 
                query.setParameter("ciudadParam", ciudad);
            else 
                if (pais>0)
                    query.setParameter ("paisParam",pais);
                else 
                    if(continente>0)
                        query.setParameter("continenteParam", continente);
//            if(fechaRegistro != null)
//                query.setParameter("fechaParam", fechaRegistro);
            
            List lista = query.list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Aeropuerto a = (Aeropuerto) iter.next();
                Hibernate.initialize(a.getEstadoAeropuerto());
                Hibernate.initialize(a.getCiudad());
                Hibernate.initialize(a.getCiudad().getCordx());
                Hibernate.initialize(a.getCiudad().getCordy());
                a.setEstadoAeropuerto(a.getEstadoAeropuerto());
                result.add(a);
            } 
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }    
        } finally {
            session.close();
        }
        return result;
    }
      
 
    
}
